package com.atguigu.hash;

import java.util.Scanner;

public class HashTabListDemo {
    public static void main(String[] args) {
        //创建一个hash表
        HashTab hashTab = new HashTab(7);
        //写一个简单菜单
        String key="";
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("add:添加雇员");
            System.out.println("list:遍历雇员");
            System.out.println("exit:退出系统");
            System.out.println("id,查询员工");
            key=scanner.next();
            switch (key){
                case "add":
                    System.out.println("输入id");
                    int id=scanner.nextInt();
                    System.out.println("输入姓名");
                    String name=scanner.next();
                    Emp emp = new Emp(id, name);
                    hashTab.add(emp);
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "id":
                    System.out.println("输入id");
                    id=scanner.nextInt();
                    hashTab.findEmpById(id);
                    break;
                case "exit":
                    scanner.close();
                    System.exit(0);
                    break;
                default:
                    break;
            }
        }
    }


}

class HashTab{
    //创建一个数组来指向每一个链表
    private EmpLinkList[] empLinkListArray;
    //数组的长度
    private int size;
    //构造函数
    public HashTab(int size){
        this.size=size;
        empLinkListArray=new EmpLinkList[size];
        //初始化每一条链表
        for (int i = 0; i < size; i++) {
            empLinkListArray[i]=new EmpLinkList();
        }
    }
    //添加雇员
    public void add(Emp emp){
        int empLinkedListNO = Arraylocate(emp.id);
        //初始化
        empLinkListArray[empLinkedListNO].add(emp);

    }
    //选择添数组哪一个位置对应的链表
    public int Arraylocate(int id){
        return id%size;
    }
    //遍历整个hash表
    public void list(){
        if(empLinkListArray.length==0){
            System.out.println("表内无数据");
            return;
        }
        for (int i = 0; i < empLinkListArray.length; i++) {
            System.out.println("empLinkListArray["+i+"]"+"数据包括：");
            empLinkListArray[i].list();
        }
    }
    //根据id查找雇员
    public void findEmpById(int id){
        //先查看该员工存储在数组对应的那一条链表中
        int EmplinkedListNO = Arraylocate(id);
        Emp emp = empLinkListArray[EmplinkedListNO].getEmpById(EmplinkedListNO);
        if(emp==null){
            System.out.println("该员工不存在");
        }else{
            System.out.printf("该员工在第%d链表中的，是%d号",EmplinkedListNO+1,id);
        }

    }
}


/*
* 创建链表来存储相同的的节点
* 包括添加和遍历
* */
class EmpLinkList{
    //创建一个头节点
    private Emp head;
    //添加方法
    public void add(Emp emp){
        if(head==null){
            //空链表时，直接添加
            head=emp;
            return;
        }
        //创建一个辅助节点
        Emp curEmp=head;
        while (true){
            if(curEmp.next==null){
                break;
            }
            curEmp=curEmp.next;
        }
        //将新的节点添加到末尾
        curEmp.next=emp;
    }

    //遍历该链表
    public void list(){
        if(head==null){
            System.out.println("空链表");
            return;
        }
        //创建一个辅助节点
        Emp empCur=head;
        while (true){
            if(empCur==null){
                break;
            }
            System.out.println(empCur.toString());
            empCur=empCur.next;
        }
    }
    //根据id查找员工
    public Emp getEmpById(int id){
        if(head==null){
            System.out.println("链表为空");
            return null;
        }
        //创建一个辅助节点
        Emp curEmp=head;
        while (true){
            if(curEmp.id==id){
                break;
            }
            if(curEmp.next==null){
                curEmp=null;
                break;
            }
            curEmp=curEmp.next;
        }
        return curEmp;

    }
}

/*
* 创建员工作为链表的节点
* 包括名字和编号
* */
class Emp{
    String name;
    int id;
    Emp next;
    public Emp(int id,String name){
        this.id=id;
        this.name=name;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}